home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / MONITOR / FACETS.ARJ / FACETS.BAS next >
BASIC Source File  |  1991-04-27  |  5KB  |  173 lines

  1. DECLARE SUB DrawPoly (A, B, C, D, E, F, G AS SINGLE)
  2.  
  3. XC = 160: YC = 100'     SCREEN CENTER COORDINATES
  4. Outline = 0
  5. OutlineColor = 62
  6. Wireframe = 0
  7. VN = 32: DIM P(VN - 1, 2)'  NUMBER OF VERTICIES
  8. FA = 60: DIM F(FA / 2, 2), SH(FA / 2), Z(FA / 2), K(FA / 2)'  NUMBER OF FACETS
  9.  
  10. CLS
  11. PRINT "SMALL STELLATED DODECAHEDRON"
  12. PRINT : PRINT
  13. PRINT "SELECT STYLE FOR DRAWING:": PRINT
  14. PRINT "  (N).  NORMAL"
  15. PRINT "  (E).  EMPHESIZE THE EDGES"
  16. PRINT "  (W).  WIRE FRAME WITH HIDDEN LINES REMOVED"
  17. PRINT : INPUT "YOUR CHOICE"; A$
  18. IF A$ = "W" THEN Wireframe = 1
  19. IF A$ = "E" THEN Outline = 1
  20.  
  21. PRINT
  22. PRINT "READING VERTEX DATA"
  23. PRINT
  24. FOR N = 0 TO VN - 1
  25.   READ P(N, 0), P(N, 1), P(N, 2)
  26. NEXT N
  27.  
  28. PRINT "ENTER X, Y, AND Z ANGLES OF ROTATION."
  29. INPUT X, Y, Z
  30. J = 3.14159265# / 180: X = X * J: Y = Y * J: Z = Z * J
  31. X0 = COS(Y) * COS(Z) - SIN(X) * SIN(Y) * SIN(Z)
  32. X1 = COS(Y) * SIN(Z) + SIN(X) * SIN(Y) * COS(Z)
  33. X2 = -COS(X) * SIN(Y)
  34. Y0 = -COS(X) * SIN(Z): Y1 = COS(X) * COS(Z): Y2 = SIN(X)
  35. Z0 = SIN(Y) * COS(Z) + SIN(X) * COS(Y) * SIN(Z)
  36. Z1 = SIN(Y) * SIN(Z) - SIN(X) * COS(Y) * COS(Z): Z2 = COS(X) * COS(Y)
  37.  
  38. PRINT
  39. PRINT "PREFORMING ROTATION"
  40. FOR N = 0 TO VN - 1
  41.   X = P(N, 0): Y = P(N, 1): Z = P(N, 2)
  42.   P(N, 0) = X0 * X + X1 * Y + X2 * Z
  43.   P(N, 1) = Y0 * X + Y1 * Y + Y2 * Z
  44.   P(N, 2) = Z0 * X + Z1 * Y + Z2 * Z
  45. NEXT N
  46.  
  47. PRINT "READING CONNECTION DATA"
  48. VF = -1'  VF = # VISIBLE FACETS
  49. FOR N = 1 TO FA
  50.   VF = VF + 1
  51.   FOR I = 0 TO 2
  52.     READ F(VF, I)
  53.   NEXT I
  54.   Z = (P(F(VF, 2), 0) - P(F(VF, 1), 0)) * (P(F(VF, 0), 1) - P(F(VF, 1), 1))
  55.   Z = Z - (P(F(VF, 0), 0) - P(F(VF, 1), 0)) * (P(F(VF, 2), 1) - P(F(VF, 1), 1))
  56.   IF Z > 0 THEN
  57.     X = (P(F(VF, 2), 1) - P(F(VF, 1), 1)) * (P(F(VF, 0), 2) - P(F(VF, 1), 2))
  58.     X = X - (P(F(VF, 0), 1) - P(F(VF, 1), 1)) * (P(F(VF, 2), 2) - P(F(VF, 1), 2))
  59.     Y = (P(F(VF, 2), 2) - P(F(VF, 1), 2)) * (P(F(VF, 0), 0) - P(F(VF, 1), 0))
  60.     Y = Y - (P(F(VF, 0), 2) - P(F(VF, 1), 2)) * (P(F(VF, 2), 0) - P(F(VF, 1), 0))
  61.     NC = SQR(X * X + Y * Y + Z * Z)
  62.     SH(VF) = 26 * (2 * Z + X + Y) / NC
  63.     SH(VF) = (SH(VF) + 64) * (SH(VF) + 64) / 256
  64.   ELSE VF = VF - 1
  65.   END IF
  66. NEXT N
  67.  
  68. PRINT "SCALING TO DISPLAY SIZE"
  69. Y = 0
  70. FOR N = 0 TO VN - 1
  71.   IF ABS(P(N, 1)) > Y THEN Y = ABS(P(N, 1))
  72. NEXT N
  73. S = 100 / Y
  74. FOR N = 0 TO VN - 1
  75.   P(N, 1) = S * P(N, 1) + YC: P(N, 0) = S * P(N, 0) + XC
  76. NEXT N
  77. FOR N = 0 TO VF
  78.   Z(N) = (P(F(N, 0), 2) + P(F(N, 1), 2) + P(F(N, 2), 2)) / 3
  79. NEXT N
  80.  
  81. PRINT "SORTING FACETS ACCORDING TO AVERAGE 'Z'"
  82.  
  83. FOR I = 0 TO VF
  84.   V = 1
  85.   FOR J = 0 TO VF
  86.     IF Z(J) < Z(V) AND Z(J) <> 1000 THEN V = J
  87.   NEXT J
  88.   K(I) = V
  89.   Z(V) = 1000
  90. NEXT I
  91.  
  92. SCREEN 13
  93. FOR I = 1 TO 63
  94.   PALETTE I, (65536 * (32 + INT(I / 2))) + (256 * I) + I
  95. NEXT I
  96. PALETTE 14, 63
  97.  
  98. FOR N = 0 TO VF
  99.   FA = K(N)
  100.   CO = SH(FA)
  101.   IF CO > 62 THEN CO = 62
  102.   IF Wireframe THEN CO = 0
  103.   X0 = P(F(FA, 0), 0): Y0 = P(F(FA, 0), 1)
  104.   X1 = P(F(FA, 1), 0): Y1 = P(F(FA, 1), 1)
  105.   X2 = P(F(FA, 2), 0): Y2 = P(F(FA, 2), 1)
  106.   CALL DrawPoly(X0, Y0, X1, Y1, X2, Y2, CO)
  107. NEXT N
  108.  
  109. DO
  110. LOOP UNTIL INKEY$ > ""
  111.  
  112. '          VERTEX DATA
  113. DATA 1000,618,0, 1000,-618,0, -1000,618,0, -1000,-618,0
  114. DATA 0,1000,618, 0,1000,-618, 0,-1000,618, 0,-1000,-618
  115. DATA 618,0,1000, -618,0,1000, 618,0,-1000, -618,0,-1000
  116. DATA 618,0,236,  618,0,-236,  -618,0,236,  -618,0,-236
  117. DATA 236,618,0,  -236,618,0,  236,-618,0,  -236,-618,0
  118. DATA 0,236,618,  0,-236,618,  0,236,-618,  0,-236,-618
  119. DATA 382,382,382,382,382,-382,382,-382,382,382,-382,-382
  120. DATA -382,382,382,-382,382,-382,-382,-382,382,-382,-382,-382
  121.  
  122. '          CONNECTION DATA
  123. DATA 0,12,13,  0,13,25,  0,25,16,  0,16,24,  0,24,12
  124. DATA 1,12,26,  1,26,18,  1,18,27,  1,27,13,  1,13,12
  125. DATA 2,15,14,  2,14,28,  2,28,17,  2,17,29,  2,29,15
  126. DATA 3,14,15,  3,15,31,  3,31,19,  3,19,30,  3,30,14
  127. DATA 4,16,17,  4,17,28,  4,28,20,  4,20,24,  4,24,16
  128. DATA 5,17,16,  5,16,25,  5,25,22,  5,22,29,  5,29,17
  129. DATA 6,19,18,  6,18,26,  6,26,21,  6,21,30,  6,30,19
  130. DATA 7,18,19,  7,19,31,  7,31,23,  7,23,27,  7,27,18
  131. DATA 8,20,21,  8,21,26,  8,26,12,  8,12,24,  8,24,20
  132. DATA 9,21,20,  9,20,28,  9,28,14,  9,14,30,  9,30,21
  133. DATA 10,23,22, 10,22,25, 10,25,13, 10,13,27, 10,27,23
  134. DATA 11,22,23, 11,23,31, 11,31,15, 11,15,29, 11,29,22
  135.  
  136. SUB DrawPoly (A, B, C, D, E, F, G AS SINGLE)
  137.  
  138. SHARED Outline, OutlineColor, Wireframe
  139.  
  140.   DIM X(3), Y(3)
  141.   X(1) = A: X(2) = C: X(3) = E
  142.   Y(1) = B: Y(2) = D: Y(3) = F
  143.  
  144.   LINE (A, B)-(C, D), 63
  145.   LINE -(E, F), 63
  146.   LINE -(A, B), 63
  147.   
  148.   X1 = (A + C) / 2: X2 = (C + E) / 2: X3 = (E + A) / 2
  149.   Y1 = (B + D) / 2: Y2 = (D + F) / 2: Y3 = (F + B) / 2
  150.   X = (X1 + X2 + X3) / 3: Y = (Y1 + Y2 + Y3) / 3
  151.   IF C - A <> 0 AND E - A <> 0 THEN
  152.     S1 = (D - B) / (C - A)
  153.     S2 = (F - B) / (E - A)
  154.     GOTO 2
  155.   END IF
  156.   IF C - A <> 0 AND E - C <> 0 THEN
  157.     S1 = (D - B) / (C - A)
  158.     S2 = (F - D) / (E - C)
  159.   END IF
  160. 2 IF ABS(S1 - S2) > .01 OR (S1 = 0 AND S2 = 0) THEN
  161.     PAINT (X, Y), 1, 63
  162.     PAINT (X, Y), G, 63
  163.   END IF
  164.  
  165.   IF Outline THEN CC = OutlineColor ELSE CC = G
  166.   IF Wireframe THEN CC = OutlineColor
  167.   LINE (A, B)-(C, D), CC
  168.   LINE -(E, F), CC
  169.   LINE -(A, B), CC
  170.  
  171. END SUB
  172.  
  173.